#include "EpollServer.hpp"
#include <memory>

int main()
{
    std::unique_ptr<EpollServer> ptr(new EpollServer);
    ptr->Start();

    // int _listen_fd = Socket::Sock();
    // std::cout << _listen_fd << std::endl;
    // Socket::Bind(_listen_fd, 8080);
    // Socket::Listen(_listen_fd);
    // int _epfd = Epoll::CreateEpoll();
    // if (!Epoll::CtlEpoll(_epfd, EPOLL_CTL_ADD, _listen_fd, EPOLLIN))
    //     exit(6);
    // int _events_num = 10;
    // epoll_event *_events = new epoll_event[_events_num];
    // while(true)
    // {
    //     auto funtion = [&]()
    //     {
    //         std::cout << "判断有无事件到来" << std::endl;
    //         sleep(1);
    //         int num = Epoll::WaitEpoll(_epfd, _events, _events_num, 0);
    //         switch (num)
    //         {
    //         case 0:
    //             std::cout << "timeout" << std::endl;
    //             break;
    //         case -1:
    //             std::cerr << "epoll_wait error" << std::endl;

    //         default:
    //             auto HanderEvent = [&](int num)
    //             {
    //                 std::cout << "有事件到来了" << std::endl;
    //                 for (int i = 0; i < num; i++)
    //                 {
    //                     switch (_events[i].events)
    //                     {
    //                     case EPOLLIN:
    //                         if (_events[i].data.fd == _listen_fd)
    //                         {
    //                             auto ServerAccept = [&]()
    //                             {
    //                                 std::cout << "get a new link" << std::endl;
    //                                 std::string client_ip;
    //                                 uint16_t client_port;
    //                                 int accept_errno;
    //                                 int sock = Socket::Accept(_listen_fd, &client_ip, &client_port, &accept_errno);
    //                                 if (sock < 0)
    //                                 {
    //                                     std::cout << "accept errno" << std::endl;
    //                                     return;
    //                                 }
    //                                 // 加入epoll中管理
    //                                 Epoll::CtlEpoll(_epfd, EPOLL_CTL_ADD, sock, EPOLLIN);
    //                             };
    //                             ServerAccept();
    //                         }
    //                         else
    //                         {
    //                             auto Receive = [&](int sock)
    //                             {
    //                                 char buffer[1024];
    //                                 int num = recv(sock, buffer, sizeof(buffer) - 1, 0);
    //                                 switch (num)
    //                                 {
    //                                 case -1:
    //                                     Epoll::CtlEpoll(_epfd, EPOLL_CTL_DEL, sock, EPOLLIN);
    //                                     close(sock);
    //                                     break;
    //                                 case 0:
    //                                     Epoll::CtlEpoll(_epfd, EPOLL_CTL_DEL, sock, EPOLLIN);
    //                                     close(sock);
    //                                 default:
    //                                     buffer[num] = 0;
    //                                     std::cout << "client:" << buffer << std::endl;
    //                                     break;
    //                                 }
    //                             };
    //                             Receive(_events[i].data.fd);
    //                         }
    //                         break;
    //                     case EPOLLOUT:
    //                         break;
    //                     // ERROR
    //                     default:
    //                         break;
    //                     }
    //                 }
    //             };
    //             HanderEvent(num);
    //             break;
    //         }
    //     };
    //     funtion();
    // }
    return 0;
}